package com.sgb.goods.entity;

import android.text.SpannableStringBuilder;

import androidx.databinding.ObservableField;

import com.blankj.utilcode.util.ColorUtils;
import com.sgb.goods.R;
import com.sgb.goods.utils.SpannableUtils;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

/**
 * 订单详情model
 *
 * @author cyj
 */
public class OrderDetailsEntity {

    /**
     * 开户账号
     */
    public String account;
    /**
     * 订单金额
     */
    public String amount;
    /**
     * 约定信息状态 1 有 0 无
     */
    public int appointState;
    /**
     * 开户银行
     */
    public String bank;
    /**
     * 供应商 收款账号
     */
    public String bankCard;
    /**
     * 开户行行号
     */
    public String bankNumber;
    /**
     * 收款凭证
     */
    public String collectionVoucher;
    /**
     * 商品信息
     */
    public List<OrderCommoditiesEntity> commodities;
    /**
     * 企业名称
     */
    public String companyName;
    /**
     * 收货人电话
     */
    public String contactPhone;
    /**
     * 创建时间 下单时间
     */
    public String created;
    /**
     * 社会统一信用代码
     */
    public String creditCode;
    /**
     * 发货状态 （ 0 待收货 1 已收货 2 未发货
     */
    public int deliverState;
    /**
     * 配送费
     */
    public String deliveryCost;
    /**
     * 订单动态
     */
    public List<OrderDynamicEntity> dynamics;
    public List<OrderDynamicEntity> dynamicEntityList = new ArrayList<>();
    /**
     * 详细地址
     */
    public String fullAddress;
    /**
     * 装卸费
     */
    public String handlingCost;
    /**
     * 订单号
     */
    public long id;
    /**
     * 安装费
     */
    public String installationCost;
    /**
     * 付款金额
     */
    public String money;
    /**
     * 收货人
     */
    public String name;
    /**
     * 供应商 开户银行
     */
    public String openingBank;
    /**
     * 订单类型 默认 1：企业下单 0 个人下单 2 团体下单
     */
    public Integer orderType;
    /**
     * 采购商 公司NO
     */
    public String owned;
    /**
     * 采购商IM账号
     */
    public String ownedImAccount;
    /**
     * 采购企业名称
     */
    public String ownedName;
    /**
     * 支付比例
     */
    public String payRatio;
    /**
     * 付款状态 -1 未申请付款 （没有支付记录） 0 待付款 1 冻结中 2 支付成功 3 支付失败 4 线下付款确认中 5 付款审批中 6 付款审批拒绝,50 进入收银台付款中 60 已撤销
     */
    public int payState;
    /**
     * 付款方式 0 网银支付 1 银行卡转账
     */
    public int paymentMethod;
    /**
     * 跳转个人网站No
     */
    public String person;
    /**
     * 跟单人名称
     */
    public String personName;
    /**
     * 跟单人手机号
     */
    public String personTel;
    /**
     * 联系电话
     */
    public String phone;
    /**
     * 接单审批 审批状态（0：审批中，1：审批通过 ，2审批不通过 3 当前状态无审批
     */
    public int processState;
    /**
     * 下单审批状态（0：待审批，1：审批通过 ，2审批不通过 3 无审批 4 当前不在审批状态 但是配置有审批
     */
    public int placeProcessState;
    /**
     * 企业注册地址
     */
    public String registeredAddress;
    /**
     * 订单状态-1 待下单 0 待接单 99 待确认 101 待支付 102 待发货 103 已发货 7 已完成 8 已取消
     */
    public int state;
    /**
     * 供应商 公司NO
     */
    public String supplier;
    /**
     * 供应商IM账号
     */
    public String supplierImAccount;
    /**
     * 供应商名称/收款账户
     */
    public String supplierName;
    /**
     * 采购方式-用于展示用  1 直接采购 2合约采购
     */
    public Integer showPurchasingMethod;
    /**
     * 货款方式（1：先款后货；2：先货后款）
     */
    public int paymentWay;
    public OtherInfoVO otherInfoVO;

    //-------------------- 自定义字段 -----------------------//
    /**
     * 标题
     */
    public String titleName = "";
    /**
     * 下单时间
     */
    public long orderTime;
    // 注意：以下相关的4个时间若存在则显示栏目，否则不显示
    /**
     * 接单时间
     */
    public long takeOrderTime;
    /**
     * 付款时间
     */
    public long paymentTime;
    /**
     * 发货时间
     */
    public long deliveryTime;
    /**
     * 签收时间
     */
    public long signTime;
    /**
     * 是否显示订单信息里的展开收起UI
     */
    public boolean isShowOrderInfoOpenUi;
    /**
     * 是否显示订单商品信息里的展开收起UI
     */
    public boolean isShowGoodsInfoOpenUi;
    /**
     * 是否显示通知信息UI
     */
    public boolean isShowNoticeInfoUi = true;
    /**
     * 是否显示物流状态的UI
     */
    public boolean isShowLogisticsStateUi;
    /**
     * 是否显示付款信息的UI 只有已完成和履约中才显示
     */
    public boolean isShowPayInfoStateUi;
    /**
     * 审批描述
     */
    public ObservableField<String> approvalDesc = new ObservableField<>("");
    /**
     * 付款信息描述
     */
    public SpannableStringBuilder payInfoDesc = new SpannableStringBuilder("");
    /**
     * 订单流程状态 1：待接单  2：待确认  3：履约中  4：已完成  5：已取消
     */
    public int orderProcessState = 0;
    /**
     * 订单类型。 1表示采购订单；2表示销售订单
     */
    public String orderDescribe = "";
    //-------------------- 自定义字段 -----------------------//

    /**
     * 初始化 主要是各种状态判断和UI文案的统一转换，不涉及业务逻辑
     *
     * @param type 1表示采购订单；2表示销售订单
     */
    public void init(String type) {
        this.orderDescribe = type;
        setApprovalDesc();
        getOrderInfoAllTime();
        isShowGoodsInfoOpenUi = commodities.size() > 5;
    }


    /**
     * 设置审批描述
     * 注意：xml布局包含了  "履约中"  支付串判断视图的显示隐藏，因此，当需求改动文案时需修改。后续在优化
     * 审批状态（0：审批中，1：审批通过 ，2审批不通过 3 当前状态无审批
     */
    public void setApprovalDesc() {
        if (-1 == state || 0 == state) {
            // 待接单
            titleName = "待接单";
            orderProcessState = 1;
            waitingOrder();
        } else if (99 == state) {
            // 待确认
            titleName = "待确认";
            orderProcessState = 2;
            isShowPayInfoStateUi = true;
            approvalDesc.set("1".equals(orderDescribe) ? "供应商已接单，请仔细核对订单信息" : "等待采购商确认订单信息");
        } else if (101 == state || 102 == state || 103 == state) {
            //履约中
            titleName = "履约中";
            orderProcessState = 3;
            isShowLogisticsStateUi = true;
            isShowPayInfoStateUi = true;
            performOrderHandle();
        } else if (7 == state) {
            // 已完成    不显示UI    这里从已完成状态界面进入，绝逼是 deliverState == 1 (已收货)，不进行设置值
            titleName = "已完成";
            orderProcessState = 4;
            isShowLogisticsStateUi = true;
            isShowPayInfoStateUi = true;
            isShowNoticeInfoUi = false;
            if (0 == paymentMethod) {
                payInfoDesc = SpannableUtils.changePartTextColor("已成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            } else if (1 == paymentMethod) {
                payInfoDesc = SpannableUtils.changePartTextColor("付款成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            }
        } else if (8 == state) {
            // 已取消    不显示UI
            titleName = "已取消";
            orderProcessState = 5;
            isShowNoticeInfoUi = false;
        }
    }

    /**
     * 待接单处理提示
     */
    private void waitingOrder() {
        if ("1".equals(orderDescribe)) {
            if (0 == placeProcessState) {
                // 审批中
                approvalDesc.set("下单审批中");
            } else if (1 == placeProcessState) {
                // 下单审批状态为已通过且供应商未接单
                approvalDesc.set("下单审批已通过，供应商接单中");
            } else if (2 == placeProcessState) {
                // 下单审批已拒绝
                approvalDesc.set("下单审批已拒绝");
            } else if (3 == placeProcessState) {
                // 未配置下单审批且供应商未接单
                approvalDesc.set("供应商接单中");
            } else {
                // 剩下状态都统一处理，一般的，此处逻辑正常情景不会进入
                approvalDesc.set("供应商接单中");
            }
        } else if ("2".equals(orderDescribe)) {
            isShowPayInfoStateUi = true;
            if (0 == processState) {
                approvalDesc.set("接单审批中");
            } else if (2 == processState) {
                approvalDesc.set("接单审批已拒绝");
            } else {
                approvalDesc.set("");
            }
        }
    }

    /**
     * 履约中处理
     */
    private void performOrderHandle() {
        if ("1".equals(orderDescribe)) {
            if (-1 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("未付款", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (5 == payState) {
                // 审批中
                payInfoDesc = SpannableUtils.changePartTextColor("审批中", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (6 == payState) {
                // 已拒绝
                payInfoDesc = SpannableUtils.changePartTextColor("已拒绝", ColorUtils.getColor(R.color.goods_color_FFFF2928));
            } else if (0 == payState) {
                // 待付款   这里可能有问题
                payInfoDesc = SpannableUtils.changePartTextColor("待付款", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (0 == paymentMethod && 50 == payState) {
                // 网银支付进入收银台-未付款
                payInfoDesc = SpannableUtils.changePartTextColor("付款中", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (0 == paymentMethod && 1 == payState) {
                // 网银支付-未解冻
                payInfoDesc = SpannableUtils.changePartTextColor("冻结中", ColorUtils.getColor(R.color.goods_color_FFC0C4CC));
            } else if (0 == paymentMethod && 2 == payState) {
                // 网银支付-已解冻
                payInfoDesc = SpannableUtils.changePartTextColor("已成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            } else if (1 == paymentMethod && 4 == payState) {
                // 银行转账 && 已付款 && 未确认收款
                payInfoDesc = SpannableUtils.changePartTextColor("确认中", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (1 == paymentMethod && 2 == payState) {
                // 银行转账 && 已确认收款 （线下付款中的付款成功）
                payInfoDesc = SpannableUtils.changePartTextColor("付款成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            } else if (60 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("已撤销", ColorUtils.getColor(R.color.goods_color_FFC0C4CC));
            }
        } else if ("2".equals(orderDescribe)) {
            if (-1 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("未付款", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (0 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("待付款", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (0 == paymentMethod && 50 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("付款中", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (0 == paymentMethod && 1 == payState) {
                // 网银支付-未解冻
                payInfoDesc = SpannableUtils.changePartTextColor("冻结中", ColorUtils.getColor(R.color.goods_color_FFC0C4CC));
            } else if (0 == paymentMethod && 2 == payState) {
                // 网银支付-已解冻
                payInfoDesc = SpannableUtils.changePartTextColor("已成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            } else if (1 == paymentMethod && 4 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("确认中", ColorUtils.getColor(R.color.goods_color_FF5792FD));
            } else if (1 == paymentMethod && 2 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("付款成功", ColorUtils.getColor(R.color.goods_color_FF06C764));
            } else if (60 == payState) {
                payInfoDesc = SpannableUtils.changePartTextColor("已撤销", ColorUtils.getColor(R.color.goods_color_FFC0C4CC));
            }
        }
    }

    /**
     * 获取发货状态字符串
     * 发货状态 （ 0 待收货 1 已收货 2 未发货
     *
     * @return
     */
    public String getDeliverStateString() {
        if (0 == deliverState) {
            return "待收货";
        } else if (1 == deliverState) {
            return "已收货";
        } else if (2 == deliverState) {
            return "未发货";
        }
        return "/";
    }

    /**
     * 获取订单信息所有的时间串
     * 订单流转状态 1 下单 2接单 3 付款 4 发货 5 签收 6取消订单 0 其他环节操作不计入流程
     */
    public void getOrderInfoAllTime() {
        // 流转状态计数变量。 prd里entity.created没有6的情况，但是测试环境会返回导致展开收起图片失效
        for (OrderDynamicEntity entity : dynamics) {
            if (10 == entity.state) {
                orderTime = entity.created;
            } else if (20 == entity.state) {
                dynamicEntityList.add(entity);
            } else if (40 == entity.state) {
                dynamicEntityList.add(entity);
            } else if (50 == entity.state) {
                dynamicEntityList.add(entity);
            } else if (60 == entity.state) {
                dynamicEntityList.add(entity);
            }
        }
        isShowOrderInfoOpenUi = dynamicEntityList.size() > 0;
    }

    /**
     * 订单额外信息
     */
    public static class OtherInfoVO {

        /**
         * 约定信息内容 动态json文本
         */
        public String appointInfo;
        /**
         * 供应商 收款账号
         */
        public String bankCard;
        /**
         * 安装服务 默认 0 无 1 卖方承担 2 买方承担
         */
        public int installService;
        /**
         * 装车服务 默认不选中为0 ，1买方承担 2 卖方承担
         */
        public int loading;
        /**
         * 约供应商 开户银行
         */
        public String openingBank;
        /**
         * 订单编号
         */
        public long orderId;
        /**
         * 其他采购商 要求
         */
        public List<Other> other;
        /**
         * 收货方式 1 卖方送达验收 2 买方提货验收
         */
        public int receivingMethod;
        /**
         * 卸车服务 默认不选中为0 ，1买方承担 2 卖方承担 3 共同承担 4 待定
         */
        public int unloading;

        public static class Other {
            /**
             * 采购商要求名称
             */
            public String name;
            /**
             * 采购商要求值
             */
            public String value;
        }

        @Override
        public @NotNull String toString() {
            return "OtherInfoVO";
        }
    }

    /**
     * 商品信息
     */
    public static class OrderCommoditiesEntity {

        /**
         * 品牌
         */
        public String brand;
        /**
         * 商品ID
         */
        public long commodityId;
        /**
         * 数量
         */
        public double count;
        /**
         * 商品图片
         */
        public String[] imgList;
        /**
         * 单价
         */
        public double money;
        /**
         * 商品名称
         */
        public String name;
        /**
         * 属性
         */
        public List<SkuDetailEntity> skuDetails;
        /**
         * skuId
         */
        public long skuId;
        /**
         * 税率
         */
        public String tax;
        /**
         * 合计/小计
         */
        public double total;
        /**
         * 计量单位
         */
        public String unit;

        /**
         * 获取sku拼接字符串
         *
         * @return
         */
        public String getSkuString() {
            StringBuffer sb = new StringBuffer("");
            if (null != skuDetails) {
                for (SkuDetailEntity skuDetailEntity : skuDetails) {
                    sb.append(skuDetailEntity.name).append("：").append(skuDetailEntity.val).append("；");
                }
            }
            return sb.toString();
        }

        /**
         * 属性
         */
        class SkuDetailEntity {
            /**
             * 名称
             */
            public String name;
            /**
             * 值
             */
            public String val;
        }
    }

    /**
     * 订单动态
     * 注意：此处的订单动态指的的订单信息中的  state  各状态下的创建时间显示
     */
    public static class OrderDynamicEntity {
        /**
         * 创建日期
         */
        public long created;
        /**
         * 创建者公司
         */
        public String creatorCompany;
        /**
         * 创建人姓名
         */
        public String creatorName;
        /**
         * 操作
         */
        public String operation;
        /**
         * 订单流转状态 10 下单 20接单 30采购商确认 40 付款 50 发货 60签收 0 其他环节操作不计入流程 取消订单70  采购商取消 80
         */
        public int state;

        /**
         * 获取订单信息所有的时间串
         * 订单流转状态 1 下单 2接单 3 付款 4 发货 5 签收 6取消订单 0 其他环节操作不计入流程
         */
        public String getOrderInfoAllTime() {
            if (10 == state) {
                return "下单时间";
            } else if (20 == state) {
                return "接单时间";
            } else if (40 == state) {
                return "付款时间";
            } else if (50 == state) {
                return "发货时间";
            } else if (60 == state) {
                return "签收时间";
            } else {
                return "";
            }
        }
    }

}
